﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Controller2.BLL;
using Controller2.Models;
using Controller2.Models.ViewModels;
using Telerik.Web.Mvc;

namespace Controller2.Controllers
{
    [Authorize]
    public class BrainstormController : Controller
    {
        #region ViewModels
        ControllerBDModelContainer db = new ControllerBDModelContainer();
        BrainstormViewModel viewModel = new BrainstormViewModel();
        #endregion

        #region Index
        [Authorize]
        public ActionResult Index() // Index padrão
        {
            ViewBag.IsInRole = true;
            var dic = new Dictionary<string, int>();
            dic.Add("Código", 1);
            dic.Add("Nome", 2);
            ViewBag.Pesquisa = PesquisaBll.PreencheComboPesquisa(dic, "Consulta de Brainstorms: ");
            Session["texto"] = "";
            Session["filtro"] = 0;
            return View();
        }

        [Authorize]
        [GridAction]
        public ActionResult AjaxGrid() // Load da grid do Telerik
        {
            var texto = Session["texto"].ToString();
            var filtro = Convert.ToInt32(Session["filtro"]);
            var pessoa = PessoaBll.GetPessoa(db, HttpContext.User.Identity.Name);
            if (pessoa != null)
            {
                var tipoPessoa = PessoaBll.GetTipoPessoa(db, pessoa);
                if (tipoPessoa.Equals("Cliente"))
                {
                    return View(new GridModel { Data = viewModel.Listar(db, texto, filtro, pessoa.IdPessoa) });
                }
                else
                {
                    return View(new GridModel { Data = viewModel.Listar(db, texto, filtro, 0) });
                }
            }
            return View(new GridModel { Data = viewModel.Listar(db, texto, filtro, 0) });
        }

        [Authorize]
        [HttpPost]
        public ActionResult Pesquisa(string texto, int filtro)
        {
            Session["texto"] = texto;
            Session["filtro"] = filtro;
            return Json(new { salvo = true });
        }
        #endregion

        #region Cadastro
        [Authorize]
        public ActionResult Cadastro(int id) // Formulário de Cadastro
        {
            var model = new Brainstorm_Topico();
            if (id > 0)
            {
                model = BrainstormBll.GetBrainstorm_Topico(db, id);
            }
            else
            {
                model.DataCadastro = DateTime.Now;
                model.UserName = User.Identity.Name;
            }
            if (User.IsInRole("Cliente"))
            {
                ViewBag.Campanha = new SelectList(db.Campanha.Where(c => c.Cliente.UserName == model.UserName).ToList(), "IdCampanha", "Nome");
            }
            else
            {
                ViewBag.Campanha = new SelectList(db.Campanha.ToList(), "IdCampanha", "Nome");
            }
            return View(model);
        }

        [Authorize]
        public ActionResult MensagensTopico(int id) // Formulário de Cadastro
        {
            if (id <= 0)
            {
                return RedirectToAction("Index");
            }
            var model = new Brainstorm_Topico();
            model = BrainstormBll.GetBrainstorm_Topico(db, id);
            return View(model);
        }

        [Authorize]
        public ActionResult Mensagem(int id, int idMensagemOrigem) // Formulário de Cadastro
        {
            if (id <= 0)
            {
                return RedirectToAction("Index", "Brainstorm");
            }
            var model = new Brainstorm_Mensagem();
            model.IdTopico = id;
            model.UserName = HttpContext.User.Identity.Name;
            model.Mensagem = "";
            if (idMensagemOrigem > 0)
            {
                model.IdMensagemOrigem = idMensagemOrigem;
            }
            return View(model);
        }
        #endregion

        #region Salvar
        [Authorize]
        [HttpPost]
        public ActionResult Salvar(Brainstorm_Topico modelView) // Método de gravação do registro
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var model = new Brainstorm_Topico();
                    TryUpdateModel(model);
                    db.Brainstorm_Topico.AddObject(model);
                    db.SaveChanges();

                    if (Request.IsAjaxRequest())
                    {
                        return Json(new { salvo = true });
                    }
                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    if (Request.IsAjaxRequest())
                    {
                        string msgEx = "Houve um erro na gravação dos dados!<br /><br />";
                        if (ex.InnerException == null)
                        {
                            msgEx += ex.Message;
                        }
                        else
                        {
                            msgEx += ex.InnerException.Message;
                        }
                        return Json(new { salvo = false, error = msgEx });
                    }
                    ModelState.AddModelError(string.Empty, ex);
                    return View(modelView);
                }
            }
            else
            {
				if (Request.IsAjaxRequest())
				{
					var msgEx = "Houve um erro desconhecido e não foi possível executar a operação!<br /><br />Por favor, tente novamente mais tarde ou entre em contato com o Administrador do Sistema.";
					return Json(new { salvo = false, error = msgEx });
				}
                return View(modelView);
            }
        }

        [Authorize]
        [HttpPost]
        [AcceptVerbs(HttpVerbs.Post)]
        [ValidateInput(false)]
        public ActionResult SalvarMensagem(Brainstorm_Mensagem modelView) // Método de gravação do registro
        {
            if (ModelState.IsValid)
            {
                try
                {
                    var model = new Brainstorm_Mensagem();
                    TryUpdateModel(model);
                    model.DataCadastro = DateTime.Now;
                    db.Brainstorm_Mensagem.AddObject(model);
                    db.SaveChanges();

                    if (Request.IsAjaxRequest())
                    {
                        return Json(new { salvo = true, dataMensagem = model.DataCadastro.ToString(), idMensagem = model.IdMensagem, idMensagemOrigem = model.IdMensagemOrigem });
                    }
                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    if (Request.IsAjaxRequest())
                    {
                        string msgEx = "Houve um erro na gravação dos dados!<br /><br />";
                        if (ex.InnerException == null)
                        {
                            msgEx += ex.Message;
                        }
                        else
                        {
                            msgEx += ex.InnerException.Message;
                        }
                        return Json(new { salvo = false, error = msgEx });
                    }
                    ModelState.AddModelError(string.Empty, ex);
                    return View(modelView);
                }
            }
            else
            {
				if (Request.IsAjaxRequest())
				{
					var msgEx = "Houve um erro desconhecido e não foi possível executar a operação!<br /><br />Por favor, tente novamente mais tarde ou entre em contato com o Administrador do Sistema.";
					return Json(new { salvo = false, error = msgEx });
				}
                return View(modelView);
            }
        }
        #endregion

        #region Excluir
        [Authorize]
        [HttpPost]
        public ActionResult Excluir(int id) // Método de exclusão do registro
        {
            try
            {
                var model = BrainstormBll.GetBrainstorm_Topico(db, id);
                if (model.Brainstorm_Mensagem.Count > 0)
                {
                    var msgEx = "Houve um erro na gravação dos dados: <br /><br />Este tópico possui mensagens, por isso, não é possível excluí-lo.";
                    return Json(new { excluiu = false, error = msgEx });
                }
                db.Brainstorm_Topico.DeleteObject(model);
                db.SaveChanges();
                return Json(new { excluiu = true });
            }
            catch (Exception ex)
            {
                string msgEx = "Houve um erro na gravação dos dados: <br /><br />";
                if (ex.InnerException == null)
                {
                    msgEx += ex.Message;
                }
                else
                {
                    msgEx += ex.InnerException.Message;
                }
                return Json(new { excluiu = false, error = msgEx });
            }
        }

        [Authorize]
        [HttpPost]
        public ActionResult ExcluirMensagem(int id) // Método de exclusão do registro
        {
            db.Connection.Open();
            using (var transaction = db.Connection.BeginTransaction())
            {
                try
                {
                    var model = BrainstormBll.GetBrainstorm_Mensagem(db, id);
                    if (model.Brainstorm_Mensagem_Resposta.Count > 0)
                    {
                        var msgEx = "Existem respostas à esta mensagem, por isso ela não pode ser excluída.";
                        return Json(new { excluiu = false, error = msgEx });
                    }
                    var contagens = db.ContagemPositivo.Where(w => w.IdMensagem == model.IdMensagem).ToList();
                    foreach (var i in contagens)
                    {
                        db.ContagemPositivo.DeleteObject(i);
                    }
                    db.Brainstorm_Mensagem.DeleteObject(model);
                    db.SaveChanges();
                    transaction.Commit();
                    return Json(new { excluiu = true, vazio = db.Brainstorm_Mensagem.Count(c => c.IdTopico == model.IdTopico) });
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    string msgEx = "Houve um erro na gravação dos dados: <br /><br />";
                    if (ex.InnerException == null)
                    {
                        msgEx += ex.Message;
                    }
                    else
                    {
                        msgEx += ex.InnerException.Message;
                    }
                    return Json(new { excluiu = false, error = msgEx });
                }
                finally
                {
                    db.Connection.Close();
                }
            }
        }
        #endregion

        #region AutoComplete
        [Authorize]
        [HttpPost]
        public JsonResult AutoComplete(int filtro, string termoPesquisa)
        {
            var data = BrainstormBll.AutoComplete(db, filtro, termoPesquisa, 10);
            return Json(data);
        }
        #endregion

        #region Positivo/Negativo
        public ActionResult AddPositivo(int id, string username)
        {
            var contagem = db.ContagemPositivo.FirstOrDefault(w => w.IdMensagem == id && w.Username.Equals(username));
            if (contagem != null)
            {
                if (contagem.Positivo)
                {
                    contagem.Positivo = false;
                    contagem.Negativo = false;
                    db.ContagemPositivo.ApplyCurrentValues(contagem);
                    db.SaveChanges();
                    return Json(new { gravou = true, positivo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Positivo), negativo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Negativo) });
                }
                else
                {
                    try
                    {
                        contagem.Positivo = true;
                        contagem.Negativo = false;
                        db.ContagemPositivo.ApplyCurrentValues(contagem);
                        db.SaveChanges();
                        return Json(new { gravou = true, positivo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Positivo), negativo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Negativo) });
                    }
                    catch (Exception ex)
                    {
                        string msgEx = "Houve um erro na gravação dos dados!<br /><br />";
                        if (ex.InnerException == null)
                        {
                            msgEx += ex.Message;
                        }
                        else
                        {
                            msgEx += ex.InnerException.Message;
                        }
                        return Json(new { gravou = false, error = msgEx });
                    }
                }
            }
            else
            {
                try
                {
                    contagem = new Brainstorm_Mensagem_Contagem();
                    contagem.IdMensagem = id;
                    contagem.Positivo = true;
                    contagem.Negativo = false;
                    contagem.Username = username;
                    db.ContagemPositivo.AddObject(contagem);
                    db.SaveChanges();
                    return Json(new { gravou = true, positivo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Positivo), negativo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Negativo) });
                }
                catch (Exception ex)
                {
                    string msgEx = "Houve um erro na gravação dos dados!<br /><br />";
                    if (ex.InnerException == null)
                    {
                        msgEx += ex.Message;
                    }
                    else
                    {
                        msgEx += ex.InnerException.Message;
                    }
                    return Json(new { gravou = false, error = msgEx });
                }
            }
        }

        public ActionResult AddNegativo(int id, string username)
        {
            var contagem = db.ContagemPositivo.FirstOrDefault(w => w.IdMensagem == id && w.Username.Equals(username));
            if (contagem != null)
            {
                if (contagem.Negativo)
                {
                    contagem.Positivo = false;
                    contagem.Negativo = false;
                    db.ContagemPositivo.ApplyCurrentValues(contagem);
                    db.SaveChanges();
                    return Json(new { gravou = true, positivo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Positivo), negativo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Negativo) });
                }
                else
                {
                    try
                    {
                        contagem.Positivo = false;
                        contagem.Negativo = true;
                        db.ContagemPositivo.ApplyCurrentValues(contagem);
                        db.SaveChanges();
                        return Json(new { gravou = true, positivo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Positivo), negativo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Negativo) });
                    }
                    catch (Exception ex)
                    {
                        string msgEx = "Houve um erro na gravação dos dados!<br /><br />";
                        if (ex.InnerException == null)
                        {
                            msgEx += ex.Message;
                        }
                        else
                        {
                            msgEx += ex.InnerException.Message;
                        }
                        return Json(new { gravou = false, error = msgEx });
                    }
                }
            }
            else
            {
                try
                {
                    contagem = new Brainstorm_Mensagem_Contagem();
                    contagem.IdMensagem = id;
                    contagem.Positivo = false;
                    contagem.Negativo = true;
                    contagem.Username = username;
                    db.ContagemPositivo.AddObject(contagem);
                    db.SaveChanges();
                    return Json(new { gravou = true, positivo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Positivo), negativo = db.ContagemPositivo.Count(c => c.IdMensagem == id && c.Negativo) });
                }
                catch (Exception ex)
                {
                    string msgEx = "Houve um erro na gravação dos dados!<br /><br />";
                    if (ex.InnerException == null)
                    {
                        msgEx += ex.Message;
                    }
                    else
                    {
                        msgEx += ex.InnerException.Message;
                    }
                    return Json(new { gravou = false, error = msgEx });
                }
            }
        }
        #endregion
    }
}
